package com.ywk.springCore.lifeCycle.core;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * bean的初始化
 * @Author zbh
 * @Date 2023/4/12
 */
@Data
@Component
@Slf4j
public class Card implements InitializingBean {

    private Integer id;

    public Card(){
        log.info("实例化：{}",this);
    }

    public Card(Integer id) {
        this.id = id;
    }

    /**
     * 通过使用注解 @PostConstruct 进行初始化，但是有一个责任链模式，
     * 如果初始化前（即 BeanPostProcessor的postProcessBeforeInitialization方法）返回值是bean，
     * 那么被注解 @PostConstruct 修饰的方法则可以运行，如果方法返回值是null，则不执行该方法。
     *
     */
    @PostConstruct
    public void initByPostConstruct(){
        this.id=1;
        log.info("执行初始化方式1（@PostConstruct）设置属性后：{}",this);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        this.setId(2);
        log.info("初始化方式2（InitializingBean.afterPropertiesSet）设置属性后：{}",this);
    }
}
